package usuario;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import model.Publicacion.Pregunta;
import model.Publicacion.Respuesta;
import model.Usuario.ModeracionPregunta;
import model.Usuario.ModeracionRespuesta;
import model.Usuario.UsuarioModerador;
import model.insigniaYlogros.InsigniaSimple;
import model.sistema.Sistema;

import org.joda.time.DateTime;
import org.junit.Before;
import org.junit.Test;

public class TestUsuarioModerador {
	
	Sistema sistema;
	UsuarioModerador usuarioMod;
	Pregunta preguntaNueva;
	Pregunta preguntaVieja;
	Respuesta respuestaNueva;
	Respuesta respuestaVieja;
	InsigniaSimple i;
	ModeracionPregunta modPreg;
	ModeracionRespuesta modRes;
	
	@Before
	public void setUp(){
		preguntaNueva = mock(Pregunta.class);
		preguntaVieja = mock(Pregunta.class);
		respuestaNueva = mock(Respuesta.class);
		respuestaVieja = mock(Respuesta.class);
		sistema       = mock(Sistema.class);
		usuarioMod =new UsuarioModerador(sistema, "JorgeElSabio", "unMail");
		i = mock(InsigniaSimple.class);
		modPreg=mock(ModeracionPregunta.class);
		modRes=mock(ModeracionRespuesta.class);
	
	}
	
	

	@Test
	public void TestModificarPregunta(){
		usuarioMod.modificarPregunta(preguntaVieja, preguntaNueva);
		verify(preguntaVieja,times(1)).modificar(preguntaNueva);	
		
	}
	
	@Test
	public void TestModificarRespuesta(){
		usuarioMod.modificarRespuesta(respuestaVieja, respuestaNueva);
		verify(respuestaVieja,times(1)).modificar(respuestaNueva);
	}

	@Test
	public void TestEliminarPregunta(){
		usuarioMod.eliminarPregunta(preguntaVieja);
		verify(preguntaVieja,times(1)).eliminar();
		
	}

	@Test
	public void TestPuntajePorActividad(){
		
		usuarioMod.hacerPregunta(preguntaNueva);
		assertEquals(10, usuarioMod.puntajePorActividad(),1);
		usuarioMod.responderApregunta(preguntaNueva, respuestaNueva);
		assertEquals(15, usuarioMod.puntajePorActividad(),1);
		usuarioMod.hacerPregunta(preguntaVieja);
		assertEquals(25, usuarioMod.puntajePorActividad(),1);

		
		
	}

	@Test
	public void TestEliminarRespuesta(){

		usuarioMod.eliminarRespuesta(respuestaVieja);
		verify(respuestaVieja,times(1)).eliminar();
		
	}

	@Test
	public void TestFactorDeRegularidadFail(){
		
		assertEquals(0.75d, usuarioMod.factorDeRegularidad(),0.01);
		
	}
	
	
	
	
	@Test
	public void TestFactorDeRegularidad(){

		
		assertEquals(0.75d, usuarioMod.factorDeRegularidad(),0.01);
		
		DateTime mesUno = new DateTime(DateTime.now().getYear(),DateTime.now().getMonthOfYear()-5,1,1,1);
		DateTime mesDos = new DateTime(DateTime.now().getYear(),DateTime.now().getMonthOfYear()-4,1,1,1);
		DateTime mesTres = new DateTime(DateTime.now().getYear(),DateTime.now().getMonthOfYear()-3,1,1,1);
		DateTime mesCuatro = new DateTime(DateTime.now().getYear(),DateTime.now().getMonthOfYear()-2,1,1,1);
		DateTime mesCinco = new DateTime(DateTime.now().getYear(),DateTime.now().getMonthOfYear()-1,1,1,1);
		DateTime mesSeis = new DateTime(DateTime.now().getYear(),DateTime.now().getMonthOfYear(),1,1,1);
		
		
		Pregunta p1 = mock(Pregunta.class);
		Pregunta p2 = mock(Pregunta.class);
		Respuesta r1 = mock(Respuesta.class);
		Respuesta r2 = mock(Respuesta.class);
		Respuesta r3 = mock(Respuesta.class);
		Respuesta r4 = mock(Respuesta.class);
		
		
		
		when(p1.getFecha()).thenReturn(mesUno);
		when(p2.getFecha()).thenReturn(mesDos);
		when(r1.getFecha()).thenReturn(mesTres);
		when(r2.getFecha()).thenReturn(mesCuatro);
		when(r3.getFecha()).thenReturn(mesCinco);
		when(r4.getFecha()).thenReturn(mesSeis);
		
		
		
		usuarioMod.hacerPregunta(p1);
		usuarioMod.hacerPregunta(p2);
		usuarioMod.responderApregunta(p1, r1);
		usuarioMod.responderApregunta(p1, r2);
		usuarioMod.responderApregunta(p1, r3);
		usuarioMod.responderApregunta(p1, r4);
		
	
	    assertEquals(1, usuarioMod.factorDeRegularidad(),0.01);
		
		
	}

	@Test
	public void TestAlgunaPublicacionModeradaEn(){
		
		
		assertFalse(usuarioMod.algunaPublicacionModeradaEn(1));
		
		when(modPreg.getMesDeModeracion()).thenReturn(1);
		when(modRes.getMesDeModeracion()).thenReturn(1);
		usuarioMod.agregarModeracionPregunta(modPreg);
		usuarioMod.agregarModeracionRespuesta(modRes);
		
		assertTrue(usuarioMod.algunaPublicacionModeradaEn(1));
		
		when(modPreg.getMesDeModeracion()).thenReturn(2);
		when(modRes.getMesDeModeracion()).thenReturn(2);
		assertFalse(usuarioMod.algunaPublicacionModeradaEn(1));
		
		
	}
	
	@Test
	public void TestCrearInsignia(){
		
		usuarioMod.crearInsignia(i);
		verify(sistema,times(1)).agregarInsignia(i);
		
	}
	
	
	
	
}
